local Module_GETDATA = {}

--[[本demo需要lbsLoc库与libnet库, 库位于script\libs, 需require]]
local lbsLoc = require("lbsLoc")
--------------------------CONST MACRO-------------------------------


ADC_CALIBRATE = 1.21/1000        -- 电压值与测量值比例修正系数，除以1000将mV转换为V

ADC_Li_BAT_CH = 0                -- 8V4锂电池采样通道
ADC_SOLAR_CH  = 1                -- 太阳能板电压采样通道

--------------------------数据点 table-------------------------------
-- 设备数据模型
Module_GETDATA.data_point = {

    solar_v  = 0,    -- 太阳能板电压
    bat_v  = 0,      -- 电池电压
    cpu_temp = 0,     -- CPU温度
    rssi = 0,         -- 信号质量
    lng = 0,          -- 基站定位经度
    lat = 0,          -- 基站定位纬度
    lng_rtk = 0,      -- RTK经度
    lat_rtk = 0,      -- RTK纬度
    iccid = "",       -- iccid
    qruid = "",       -- 二维码ID 与 client_id 绑定
    imei = "",        -- imei
    clientid = ""
}


local dp = Module_GETDATA.data_point        -- data_point的别名


-- 功能:获取基站对应的经纬度后的回调函数
-- 参数:-- result：number类型，0表示成功，1表示网络环境尚未就绪，2表示连接服务器失败，3表示发送数据失败，4表示接收服务器应答超时，5表示服务器返回查询失败；为0时，后面的5个参数才有意义
-- lat：string类型，纬度，整数部分3位，小数部分7位，例如031.2425864
-- lng：string类型，经度，整数部分3位，小数部分7位，例如121.4736522
-- addr：目前无意义
-- time：string类型或者nil，服务器返回的时间，6个字节，年月日时分秒，需要转为十六进制读取
    -- 第一个字节：年减去2000，例如2017年，则为0x11
    -- 第二个字节：月，例如7月则为0x07，12月则为0x0C
    -- 第三个字节：日，例如11日则为0x0B
    -- 第四个字节：时，例如18时则为0x12
    -- 第五个字节：分，例如59分则为0x3B
    -- 第六个字节：秒，例如48秒则为0x30
-- locType：numble类型或者nil，定位类型，0表示基站定位成功，255表示WIFI定位成功
local function getLocCb(result, lat, lng, addr, time, locType)
    log.info("testLbsLoc.getLocCb", result, type(lat), type(lng))
    -- 获取经纬度成功
    if result == 0 then
        dp.lat = tonumber(lat)          --字符串转换为数字
        dp.lng = tonumber(lng)          --字符串转换为数字

        -- log.info("服务器返回的时间", time:toHex())
        -- log.info("定位类型,基站定位成功返回0", locType)
    end

    if dp.lat == nil or dp.lng == nil  then
        dp.lat = 0
        dp.lng = 0
    end

    -- 广播给其他需要定位数据的task
    -- sys.publish("lbsloc_result", result, lat, lng)
end


--[[
功能  ：定期采集电池电压、太阳能板电压、lbs定位等
参数  ：



返回值：无
]]
sys.taskInit(function ()
    -- adc.setRange(adc.ADC_RANGE_3_8) --开启的内部分压，可以把量程扩大
    adc.open(ADC_SOLAR_CH)
    adc.open(ADC_Li_BAT_CH)
    -- 读取CPU温度, 单位为0.001摄氏度, 是内部温度, 非环境温度
    adc.open(adc.CH_CPU)


    sys.waitUntil("IP_READY", 30*1000)          -- lbs基站定位需要等待网络ready

    -- local CHRG_RLY_CTRL= gpio.setup(34, 0, gpio.PULLUP)
    -- local SNSR_485_DIR=  gpio.setup(2, 0, gpio.PULLUP)
    -- local SNSR_PWR_EN=   gpio.setup(1, 0, gpio.PULLUP)
    -- local CTRL_485_DIR=  gpio.setup(24, 0, gpio.PULLUP)
    -- local CTRL_PWR_EN=   gpio.setup(22, 0, gpio.PULLUP)
    while true do

        sys.waitUntil("notify_valve_query",MQTT_KEEP_ALIVE_TIMEOUT/2)   -- notify_valve_query rssi=1招测命令接触阻塞

        local adc_dataReg  =adc.get(ADC_SOLAR_CH)
        local adc_vol = adc_dataReg*ADC_CALIBRATE
        dp.solar_v = adc_vol*(200+47)/47        -- 分压电阻为 47K + 200K
        adc_dataReg  = adc.get(ADC_Li_BAT_CH)
        adc_vol = adc_dataReg*ADC_CALIBRATE
        dp.bat_v = adc_vol*(200+47)/47          -- 分压电阻为 47K + 200K

        adc_dataReg  = adc.get(adc.CH_CPU)
        dp.cpu_temp =  adc_dataReg*0.001        -- 将read到的数据乘以0.001换算到摄氏度

        ----------lbs定位请求-----------
        mobile.reqCellInfo(15)
        sys.waitUntil("CELL_INFO_UPDATE", 3000)
        lbsLoc.request(getLocCb)

        ------------------信号质量------------------
        local rsrq = mobile.rsrq()
        if rsrq ~= 0 then
            rsrq = rsrq + 20        -- 当前rsrq值,若失败返回0. 取值范围: -3 ~ -19.5 最大绝对值取20，值越大越好, +20返回正值
            rsrq = rsrq * 5         -- 映射到0-100范围
        end

        dp.rssi = rsrq             -- 获取换算后 0-100的发送功率值
        --------------------------------------------

        log.info("ADC","CPU TEMP=", dp.cpu_temp, "BAT_V=", dp.bat_v,  "SOLAR_V=", dp.solar_v, "rssi=", dp.rssi)
        log.info("lbs" , dp.lat, dp.lng)


    end
end)


-------------------------------

return Module_GETDATA
